#include "usart3.h"

u8 USART3_RX_BUF[USART3_REC_LEN]; // 数组用来存储接收到的数据，而USART3_REC_LEN为最多能接收的字节限度
u16 USART3_RX_STA = 0;            // 接收状态标记	 0-14位为接收字节数，15位接收完成标志位
void usart3_init(u32 bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructurea;
    USART_InitTypeDef USART_InitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); // 使能串口3
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能GPIOB
    USART_DeInit(USART3);                                  // 串口3复位 不是必要的一步

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure); // PB10设置为复用推挽输出

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_Init(GPIOB, &GPIO_InitStructure); // PB11设置为浮空输入

    /* NVIC_InitStructurea.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructurea.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructurea.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructurea.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStructurea); // 串口3中断的设置 */

    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 串口3中断使能和中断类型设置

    USART_InitStruct.USART_BaudRate = bound;                                     // 串口波特率
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件数据流控制
    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Rx;                 // 收发模式
    USART_InitStruct.USART_Parity = USART_Parity_No;                             // 无奇偶校验位
    USART_InitStruct.USART_StopBits = USART_StopBits_1;                          // 一个停止位
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;                     // 字长为8位数据格式
    USART_Init(USART3, &USART_InitStruct);                                       // 串口3的一些参数设置

    USART_Cmd(USART3, ENABLE); // 串口3使能
}
/* void USART3_IRQHandler() // 串口3的中断
{
    u8 res;                                                // 暂时缓存接收的数据
    if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) // 判断是否为串口3接收中断
    {

        res = USART_ReceiveData(USART3);             // 接收到数据放进res
        printf("recv data: %d \r\n",res);
        USART3_RX_BUF[USART3_RX_STA & 0x7FFF] = res; // 数据放进数组中，则可以用到main函数中了
        USART3_RX_STA++;                             // 字节长度++
        if (USART3_RX_STA > (USART3_REC_LEN - 1))
            USART3_RX_STA = 0;                          // 接收数据错误,重新开始接收	+;
        USART3_RX_STA |= 0x8000;                        // 串口3接收完成
        USART_ClearITPendingBit(USART3, USART_IT_RXNE); // 清除接收中断标志
    }
} */
